package com.example.websocket.controller;

import com.example.websocket.model.ChatGroup;
import com.example.websocket.model.CreateGroupRequest;
import com.example.websocket.service.ChatGroupService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.security.Principal;
import java.util.List;

/**
 * 群聊控制层，用于群聊 CRUD
 */
@RestController
@RequestMapping("/chatGroup")
@RequiredArgsConstructor
public class ChatGroupController {

    private final ChatGroupService chatGroupService;

    // 用户创建新群聊
    @PostMapping("/create")
    public ResponseEntity<String> createGroup(@RequestBody CreateGroupRequest request, Principal principal) {
        String creatorUsername = principal.getName();
        chatGroupService.createGroup(request.getGroupName(), creatorUsername);
        String data = "模拟数据";
        return ResponseEntity.ok(data);
    }

    // 用户删除群聊
    @RequestMapping("/deleteChatGroup")
    public String deleteChatGroup(String groupId, String userId) {
        chatGroupService.deleteChatGroup(groupId, userId);
        return "deleteChatGroup";
    }

    // 修改群聊
    @RequestMapping("/updateChatGroup")
    public String updateChatGroup(CreateGroupRequest request) {
        chatGroupService.updateChatGroup(request);
        return "updateChatGroup";
    }

    // 查询群聊
    @RequestMapping("/getChatGroup")
    public String findChatGroup(){
        return "getChatGroup";
    }

    // 用户加入群聊
    @PostMapping("/{groupId}/join")
    public ResponseEntity<Void> joinGroup(@PathVariable String groupId, Principal principal) {
        String username = principal.getName();
        chatGroupService.addMemberToGroup(groupId, username);
        return ResponseEntity.noContent().build();
    }

    // 用户退出群聊
    @PostMapping("/{groupId}/leave")
    public ResponseEntity<Void> leaveGroup(@PathVariable String groupId, Principal principal) {
        String username = principal.getName();
        chatGroupService.removeMemberFromGroup(groupId, username);
        return ResponseEntity.noContent().build();
    }

    // 获取用户所属的所有群聊
    @GetMapping("/user/groups")
    public ResponseEntity<List<ChatGroup>> getUserGroups(Principal principal) {
        String username = principal.getName();
        List<ChatGroup> userGroups = chatGroupService.getUserGroups(username);
        return ResponseEntity.ok(userGroups);
    }

    // 其他群聊管理相关的方法...

}

// @Payload 用于访问消息的 payload，由配置的 MessageConverter 转换（例如，从JSON）。
// 这个注解的存在不是必须的，因为默认情况下，如果没有其他参数被匹配，它就会被假定。
// 你可以用 @jakarta.validation.Valid 或Spring的 @Validated 来注解 payload 参数，以使 payload 参数被自动验证。

// @Header 用于访问一个特定的 header 值

// @DestinationVariable 用于访问从消息 destination 提取的模板变量。必要时，值被转换为声明的方法参数类型。
// Principal 反映在WebSocket HTTP握手时登录的用户。


// 默认情况下，@MessageMapping 方法的返回值通过匹配的 MessageConverter 被序列化为一个 payload，并作为一个 Message 发送到 brokerChannel，
// 从那里被广播给订阅者。出站消息的 destination 与入站消息的 destination 相同，但前缀为 /topic。

// 你可以使用 @SendTo 和 @SendToUser 注解来定制输出消息的 destination。@SendTo 是用来定制目标 destination 或指定多个 destination 的。
// @SendToUser 用来指导输出消息只给与输入消息相关的用户。
// @SendTo 和 @SendToUser 只是一种便利，相当于使用 SimpMessagingTemplate 来发送消息。如果有必要，对于更高级的场景， @MessageMapping 方法可以直接使用 SimpMessagingTemplate。这可以代替返回值，也可以在返回值之外进行。

// 消息可以被异步处理，@MessageMapping 方法可以返回 ListenableFuture、 CompletableFuture 或 CompletionStage。

// 一个应用程序可以使用 @MessageExceptionHandler 方法来处理来自 @MessageMapping 方法的异常。